home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 7
/
FM Towns Free Software Collection 7.iso
/
ms_dos
/
div
/
all
next >
Wrap
Text File
|
1993-11-30
|
32KB
|
1,058 lines
# DIVIDE_START=update.doc
・「-s」オプションの導入。「静かに!」実行する。
-------------------------- div001f --------------------------
1993.8.6
・ディレクトリ指定のファイルの検索のバグを修正。
・フリコレ7応募版。
1993.7.19
・「-u」において、「削除しない」を選択すると戻り値が1で終了するようにした。
-------------------------- div001e --------------------------
1993.6.22
・新しいオプションを追加した。
「-a:xxxxx」部分のファイルから1つにまとめたファイルを作る。(追加モード)
-------------------------- div001d --------------------------
1993.6.21
「-u:xxxxx」オプションの際、拡張子によって部分ファイル名を記述する行の制御
を追加した。本日追加したのは、「*.bat」である。
1993.5.24
「-u:xxxxx」オプションの際、拡張子によって部分ファイル名を記述する行の制御
を追加した。本日追加したのは、「*.plt」と「*.plp」である。いずれも、MopT
ermのパイロットの拡張子である。(FAPXのファイルということ)
-------------------------- div001c --------------------------
プロテクトモードのプログラムにした。
-------------------------- div001b --------------------------
1993.5.18
・新しいオプションを追加した。
「-u:xxxxx」部分のファイルから1つにまとめたファイルを作る。
1993.3.30
・新しいオプションを追加した。
「-n」新しいファイルを作る。*.new というファイルが作られる。
・内部処理を少し変更した。「-o:」オプションが設定されている時は、古い方のフ
ァイルの部分ファイルを検索しないようにした。
・部分ファイルを検索した時、見つかった数を表示するうよにした。
1993.3.28
・「/* INCLUDE=xxxxx」を展開しないオプションを追加した。
-i-
1993.3.21
・「-o:xxxxx」スイッチを指定すると *.old というファイルは出力しないように
した。
また、出力するファイル名の指定にワイルドカードを可能にした。
・分割ファイル名の比較に、ファイル名を大文字として比較することにした。
MS-DOS の仕様に合わせたということ。
・「update.doc」の追加。(忘れていた)
-------------------------- div001a --------------------------
1993.3.19
・FFMHOB のデータライブラリー4番に登録された。
# DIVIDE_END
# -DIVIDE_START=div.ggg
======================================================================
【ソフト 名】 DIV.EXE ファイル分割プログラム Version 0.01f
【登 録 名】 div001f.lzh (LHAで解凍して下さい)
【検索 キー】 1:DIV
【著作権 者】 山先 GHH01217
【開発 環境】 Turbo-C Ver2.0 → div.exe
【対応 機種】 MS-DOS 汎用
【動作 確認】 FM-TOWNS20F + 8M-RAM コンソール上
【公 開 日】 93/05/24
【ソフトウェア種別】 プログラミングツール。フリー・ソフトウェア。
======================================================================
【ソフト紹介】
Cの分割されたソースを一本化した際、再度分割するのを支援するプログラムです。
LHAを使って解凍すると、div.exe というファイルと all というファイルが出来
ます。そこで、「div all」とすると、ドキュメントファイル等が出てきます。
使い方は、div.doc をお読み下さい。
変更点については、update.doc をお読み下さい。
ダウンロードファイル名を div001f.lzh として下さい。
GHH01217 山先
# DIVIDE_END
/* DIVIDE_START=div.doc */
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
ファイル分割ツール DIV.EXE の使い方
div.doc
■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□■□
1.DIV.EXEとは
C言語の特徴の1つとして、分割コンパイルが可能ということがあります。
1つのプログラムを作るのに1つのソースファイルだけで全体が記述してあ
るというようなプログラムであると、「ちょっと修正」という場合にでも、
ソースファイルを全部をエディタに読み込んでエディットし、コンパイルし
なければなりません。時間がかかってしまうということになります。
そこで、ソースファイルを機能ごとに分割し、それぞれを別々に記述し、
別々にコンパイルして、最終的に1つのプログラムにするという手法がとら
れました。「分割コンパイルが可能」ということです。
ところが、この分割コンパイルでプログラムを記述していると、非常にた
くさんのファイルが作られることになります。そして、きちんと仕様を決定
しないで安易にプログラムを作っていると、機能の変更とか追加の場合に修
正が大変になってしまうことがあります。例えば、重複して「static」な変
数を定義していたり、ほとんど同じ様な機能の関数を定義していたりします。
また、新しい変数や関数を導入する場合、それまでの変数名や関数名を変更
した場合もあります。そのような場合、ファイルが1つであると、逆に便利
である場合もあります。
市販のエディタにVzというエディタがあります。安価であるのに非常に
優秀なエディタでありまして、大きなファイルでも、非常に高速に文字列を
検索したり置換したりできます。このエディタを使用していると、文字列の
置換のために別のプログラムを起動しなくても充分実用になります。
ということは、逆に、分割されたファイルを1つに纏めたり、再度分割で
きたりするプログラムがあれば良いことになります。そこで作ったのが本プ
ログラムです。
さて、複数のファイルを1つにまとめる場合、いろんな手法でまとめるこ
とができると思います。1つは、纏めたファイルとは別に「どこに」「どの
ような」ファイルがあるかという、いわばインデックスのファイルを用意し
て、それでそれぞれのファイルを管理するというやり方です。あるいは、1
つに纏めたファイルの中に、ソースファイル中には現れそうにないコードや
文字列を挿入しておくという方法もあります。
本プログラムでは、その第2の方法としてソースファイルには現れそうに
ない文字列を1つに纏めたファイルの中に挿入し、その文字列を探索するこ
とを通して、ファイルの区切りとしています。また、1つに纏めたファイル
の拡張子を「.old」とした別のファイルを作り、そのファイルとの一致・不
一致を調べることによって修正が「あった」「なかった」を判断しています。
2.DIVが識別する、区切りの文字列
(1) CTは、次の文字列を行の頭から記述してあると、そこから新しいファイ
ルが始まると判断します。
/* DIVIDE_START= (a)
/* -DIVIDE_START= (b)
# DIVIDE_START= (c)
# -DIVIDE_START= (d)
; DIVIDE_START= (e)
; -DIVIDE_START= (f)
これらの文字列の後ろにファイル名を記述しておきます。ファイル名の後
ろの文字列は無視されます。例えば次のように指定します。
/* DIVIDE_START=div.doc */
ファイル名の長さは32バイトまでとしています。存在しないディレクト
リをファイル名の中に記述してあると、エラーで処理が中断されますので、
注意して下さい。
(2) また、次の文字列が行の頭から記述してあると、そこでそのファイルは終
了したと判断します。
/* DIVIDE_END */
# DIVIDE_END
; DIVIDE_END
(3) 更に、ファイルの途中に、次の文字列があると、挿入複写の操作を行い
ます。
/* INCLUDE=
(4) これらの文字列は、普通、分割するファイルの中に複写されます。しか
し、(1)の(b)(d)(f) の場合のように「DIVIDE_START」の前にハイフン「-」
を入れることにより、これらの区切りの文字列を複写しないように指定する
ことができます。
3.DIVの起動の仕方
(1) 1つに纏めたファイルから分割する場合
これは、非常に簡単です。1つに纏めたファイルの名前を「all」とする
と、
div all
とするだけで、区切りの文字列を探索してファイルを分割します。
この場合、DIVは同じファイル名で拡張子が「.old」のファイル(
「all.old」)を探します。もしそのファイルがないと、DIVは、「all」
から、全てのファイルを切り出します。もしそのファイルがあると、その中
のファイルと一致・不一致をチェックして、一致しないファイルだけを書き
出します。
そして、最後に「all」を「all.old」に上書きします。これで、次回の
「div all」に備えることができます。
(2) 分割したファイルを1つに纏める場合
これには、大きく2つの方法があります。いずれの場合も、纏めるファイ
ルを指定しなければなりません。纏め先のファイルも指定しなければなりま
せん。
纏め方の第1は、纏め先に無条件に指定のファイルを追加する方法です。
次のように指定します。
div -a:*.c all
こうすると、カレント・ディレクトリの拡張子が「.c」のファイルが全て
「all」というファイルの後ろに追加されます。追加するファイルが「all」
に含まれているかどうかはチェックしていませんので、注意して使用して下
さい。
第2の方法は、次のようにします。
div -u:*.c all
これも、上の方法と殆ど同じになりますが、唯一異なるのは「all」とい
うファイルがあった場合の処理が異なるということです。上の「-a」では単
純に「all」というファイルに追加するだけだったのですが、この場合は
「all」というファイルがあった場合は、それを削除して良いかどうかを尋
ねて来ます。そこで、「y」と入力すると「all」というファイルは削除され、
拡張子「.c」のファイルが「all」に追加されていきます。また、「n」と入
力すると、処理は中断され、戻り値が1で終了します。
この、戻り値が1で終了することを利用して、次のようなバッチファイル
を作って1つに纏めたファイルを作ると便利です。
rem update.bat
div -u:*.c all
if errorlevel 1 goto end
div -a:*.h all
div -a:*.doc all
div -a:makefile all
:end
(3) 使用例
例として、このプログラムのソース等を一本化したファイルを添付してあ
るので、それを分割してみて下さい。
使い方
div all
また、「div」とだけ入力するとオプションの指定が表示されます。
★★★★★★★
4.★★ 注意 ★★
★★★★★★★
分割するファイル名の指定を間違えると、元のファイルが削除されてしま
うので、注意して下さい。例えば、「all」という1つに纏めたファイルの
中に「all」という分割するファイルがあったりすると………
5.著作権
本プログラムはNIFTY-ID:GHH01217 山先(やません)
に著作権があるものとします。しかし、その使用、配付は自由に行っていた
だいてかまいません。
6.何かありましたら。
私あてメールを下さい。
GHH01217 山先
/* DIVIDE_END */
# -DIVIDE_START=m.bat
echo off
:loop
if "%1"=="" goto main
vz %1
:loop2
make
if errorlevel 1 goto error
goto end
:main
vz all
div all
goto loop2
:error
pause
goto loop
:end
# DIVIDE_END
# -DIVIDE_START=listlibs
e:\tc\lib\mylib e:\tc\lib\emu e:\tc\lib\maths e:\tc\lib\cs
# DIVIDE_END
# DIVIDE_START=makefile
COM_VERSION1 = 0
COM_VERSION2 = 01f
VERSION = $(COM_VERSION1)$(COM_VERSION2)
tc = tcc
lib = tlib
link = tlink
cflags = -ms -A -d -N -O -DVERSION="$(COM_VERSION1).$(COM_VERSION2)"
.c.obj :
$(tc) -c $(cflags) -Ie:\tc\include $*
.c.com :
$(tc) $(cflags) -Ie:\tc\include $*
$(link) /c \tc\lib\c0t.obj $*.obj , $* , nul , @listlibs
com_prg = div.exe
hdr1 = \tc\include\mylib.h
obj1 = main.obj
$(com_prg) : $(obj1) makefile $(hdr1)
tlink /c \tc\lib\c0s.obj $(obj1) , $* , nul , @listlibs
copy $(com_prg) d:\exe
lha u $*$(VERSION) *.exe all
$(obj1) : $(hdr1) makefile
# DIVIDE_END
/* DIVIDE_START=main.c */
/*
ファイル分割ツール div.doc
作 : 山先(NIFTY-ID:GHH01217)
*/
#include <mylib.h>
#include <ctype.h>
#include <string.h>
#include <dos.h>
#include <dir.h>
#define MAX_FILENAME_LEN 32
#define MAX_BUFSIZE (1024*20)
struct DIV {
char file[ MAX_FILENAME_LEN ];
long seek;
};
#define MAX_DIV 400
static struct DIV div_new[ MAX_DIV ] , div_old[ MAX_DIV ];
static int max_new_div , max_old_div;
static FILE *fpi , *fps , *fpo , *fpl;
static char outfile[ MAX_FILENAME_LEN ];
static char new_file[ MAX_FILENAME_LEN ];
static char old_file[ MAX_FILENAME_LEN ];
static char new_file_name[ MAX_FILENAME_LEN ];
static char str[ MAX_BUFSIZE ];
static int line_number;
static char list_file_name[ MAX_FILENAME_LEN ];
static int list_file_sw = FALSE;
static int make_new_file = FALSE;
#define MAX_OUT_FILES 20
static char out_files[ MAX_OUT_FILES ][ MAX_FILENAME_LEN ];
static int max_out_files = 0;
static int out_option_line_sw = TRUE;
static int verify = FALSE;
static int without_include = FALSE;
#define mess_check if ( verify == TRUE )
static void useage()
{
printf( "ファイル分割ツール\n\t%s\tversion=%s by ... 山先(GHH01217)"
"\n\n使い方:div [-option] file名"
"\n options ="
"\n -l:xxxxx ・・・・・・・ 出力ファイルのリスト"
"\n -o:xxxxx ・・・・・・・ 出力するファイルの指定"
"\n -u:xxxxx ・・・・・・・ 部分ファイルから1つにまとめたファイル"
"を作る"
"\n -a:xxxxx ・・・・・・・ 部分ファイルから1つにまとめたファイル"
"を作る(追加モード)"
"\n -v ・・・・・・・・・・・・・ 途中経過の表示"
"\n -i- ・・・・・・・・・・・・ INCLUDE 指定を無視する"
"\n -n ・・・・・・・・・・・・・ 部分ファイルの名前の順に"
"新しいファイルを作る。"
, str
, VERSION
);
}
static char *last_comma( char *str )
{
char *result;
result = str;
while ( *str ) { if ( *str == '.' ) result = str;
str++;
}; return( result );
}
static char *last_yen( char *str )
{
char *result;
result = str;
while ( *str ) { if ( *str == '\\' ) result = str;
str++;
}; return( result );
}
static void set_list_file( char *file )
{
if ( *file != ':' ) {
printf( "\nオプションの指定が間違っています <%s>" , file );
exit( 1 );
};
file++;
strcpy( list_file_name , file );
list_file_sw = TRUE;
}
static void set_out_files( char *file )
{
int c;
char *p;
if ( *file != ':' ) {
printf( "\nオプションの指定が間違っています <%s>" , file );
exit( 1 );
};
if ( max_out_files >= MAX_OUT_FILES ) {
printf( "\n出力するファイルの指定が多すぎます → "
"最大で %d です" , MAX_OUT_FILES
);
exit( 1 );
};
file++;
while( *file ) {
if ( max_out_files >= MAX_OUT_FILES ) {
printf( "\n出力するファイルの指定が多すぎます → "
"最大で %d です" , MAX_OUT_FILES
);
exit( 1 );
};
p = out_files[ max_out_files ];
while( ( *file != ',' )
&& ( ! isspace( *file ) )
&& ( *file != '\0' )
) {
c = *file++;
*p++ = toupper( c ); /* 大文字にして格納する */
};
if ( p != out_files[ max_out_files ] ) {
*p = '\0';
max_out_files++;
};
if ( ( *file == ',' )
|| isspace( *file )
) {
file++;
};
};
}
static void set_include_opt( char *opt )
{
if ( *opt == '-' ) {
without_include = TRUE; return;
};
}
static void set_options( char *opt )
{
switch( *opt ) {
case 'l': set_list_file( opt + 1 ); break;
case 'o': set_out_files( opt + 1 ); break;
case 'v': verify = TRUE; break;
case 'i': set_include_opt( opt + 1 ); break;
case 'n': make_new_file = TRUE; break;
};
}
static void main_loop_include( char *file )
{
FILE *fpi2;
if ( without_include == TRUE ) return;
if ( ( fpi2 = fopen( file , "r" ) ) == NULL ) {
printf( "\n<%s>が見つかりません" , file );
return;
};
while ( fgets( str , MAX_BUFSIZE , fpi2 ) != NULL ) {
fprintf( fpo , "%s" , str ); line_number++;
};
fclose( fpi2 );
}
static void get_file_name( char *str , char *out_file )
{
char *p;
p = str; while ( isspace( *p ) ) p++;
strcpy( out_file , p );
p = out_file; while ( ! isspace( *p ) ) p++;
*p = '\0';
p = out_file; while ( *p ) *p++ = toupper( *p );
}
static int isEquFile_sub( const char *name1 , const char *name2 )
{
while ( *name2 ) {
if ( *name2 == '*' ) return( YES );
if ( *name2 != '?' ) {
if ( *name1 != *name2 ) return( NO );
};
name1++; name2++;
};
if ( *name1 == *name2 ) return( YES );
return( NO );
}
static int isEquFile( const char *file1 , char *file2 )
{
char name1[ MAX_FILENAME_LEN ] , name2[ MAX_FILENAME_LEN ];
char *p1 , *p2;
p1 = last_yen( file1 ); if ( *p1 == '\\' ) p1++;
p2 = name1;
while( *p1 && *p1 != '.' ) *p2++ = *p1++; *p2 = '\0';
p1 = last_yen( file2 ); if ( *p1 == '\\' ) p1++;
p2 = name2;
while( *p1 && *p1 != '.' ) *p2++ = *p1++; *p2 = '\0';
if ( isEquFile_sub( name1 , name2 ) == NO ) return( NO );
/* 拡張子の比較 */
p1 = last_comma( file1 ); if ( *p1 == '.' ) p1++;
p2 = name1;
while( *p1 ) *p2++ = *p1++; *p2 = '\0';
p1 = last_comma( file2 ); if ( *p1 == '.' ) p1++;
p2 = name2;
while( *p1 ) *p2++ = *p1++; *p2 = '\0';
if ( isEquFile_sub( name1 , name2 ) == NO ) return( NO );
return( YES );
}
static int check_file_name( const char *out_file )
{
int i;
if ( max_out_files == 0 ) return( TRUE );
for ( i = 0 ; i < max_out_files ; i++ ) {
if ( isEquFile( out_file , out_files[ i ] ) == YES ) return( TRUE );
};
return( FALSE );
}
struct DIVIDE_LINE {
char *name;
int len;
};
struct DIVIDE_LINE divide_line[] = {
/* 123456789 123456789 */
{ "/* DIVIDE_START=" , 16 },
{ "/* -DIVIDE_START=" , 17 },
{ "# DIVIDE_START=" , 15 },
{ "# -DIVIDE_START=" , 16 },
{ "; DIVIDE_START=" , 15 },
{ "; -DIVIDE_START=" , 16 },
{ "REM DIVIDE_START=" , 17 },
{ "REM -DIVIDE_START=", 18 }
};
static int
isStartLine( char *str , int *keta )
{
int i;
for( i=0 ; i<sizeof(divide_line) ; i++ ) {
if ( strncmp( str , divide_line[i].name , divide_line[i].len ) == 0 ) {
*keta = divide_line[ i ].len;
return( TRUE );
};
};
return( FALSE );
}
static int
isDivideEnd( const char *str )
{
/* 123456789 1234567 */
if ( strncmp( str , "/* DIVIDE_END */" , 16 ) == 0 ) return( TRUE );
if ( strncmp( str , "# DIVIDE_END" , 12 ) == 0 ) return( TRUE );
if ( strncmp( str , "; DIVIDE_END" , 12 ) == 0 ) return( TRUE );
if ( strncmp( str , "REM DIVIDE_END" , 14 ) == 0 ) return( TRUE );
return( FALSE );
}
static void main_loop_sub( int new )
{
char *p;
p = div_new[ new ].file;
if ( check_file_name( p ) != TRUE ) return;
if ( ( fpo = fopen( p , "w" ) ) == NULL ) {
printf( "\n<%s>を書き込みの為にオープンできません" , p );
return;
};
fpi = fopen( new_file , "r" );
fseek( fpi , div_new[ new ].seek , SEEK_SET );
fgets( str , MAX_BUFSIZE , fpi );
if ( strncmp( str , "/* -DIVIDE_START=" , 17 ) == 0
|| strncmp( str , "# -DIVIDE_START=" , 16 ) == 0
|| strncmp( str , "; -DIVIDE_START=" , 16 ) == 0
|| strncmp( str , "REM -DIVIDE_START=", 18 ) == 0
) {
out_option_line_sw = FALSE;
} else {
out_option_line_sw = TRUE;
};
printf( "\n<%-13s>を分割 " , p );
line_number = 0;
if ( out_option_line_sw == TRUE ) {
fprintf( fpo , "%s" , str );
line_number++;
};
while ( fgets( str , MAX_BUFSIZE , fpi ) != NULL ) {
if ( isDivideEnd( str ) == TRUE ) break;
fprintf( fpo , "%s" , str ); line_number++;
/* 123456789 123 */
if ( strncmp( str , "/* INCLUDE=" , 11 ) == 0 ) {
get_file_name( str + 11 , outfile );
main_loop_include( outfile );
};
};
if ( out_option_line_sw == TRUE ) {
fprintf( fpo , "%s" , str ); /* DIVIDE_END の行 */
line_number++;
};
fclose( fpo ); fclose( fpi );
printf( " %4d 行" , line_number );
}
static void
set_struct_div_end( FILE *fpi , int ptr , int count , struct DIV *div )
{
get_file_name( str + ptr , div[ count ].file );
if ( count >= MAX_DIV ) {
printf( "\nファイル中の部分ファイルの数が多すぎて処理できません。"
"(最大=%d)" , MAX_DIV
);
exit( 1 );
};
while ( fgets( str , MAX_BUFSIZE , fpi ) != NULL ) {
/* 123456789 123456 */
if ( isDivideEnd( str ) == TRUE ) break;
};
}
int Sort( const struct DIV *div1 , const struct DIV *div2 )
{
return( strcmp( div1->file , div2->file ) );
}
static int set_struct_div( const char *file , struct DIV *div )
{
FILE *fpi;
int i , count , keta;
if ( ( fpi = fopen( file , "r" ) ) == NULL ) return( 0 );
count = 0;
div[ count ].seek = ftell( fpi );
while ( fgets( str , MAX_BUFSIZE , fpi ) != NULL ) {
if ( isStartLine( str , &keta ) == TRUE ) {
set_struct_div_end( fpi , keta , count , div );
count++;
};
div[ count ].seek = ftell( fpi );
};
fclose( fpi );
qsort( (char *)div , count , sizeof( struct DIV ) , Sort );
/* 同じ物がないかチェックする */
for( i = 0 ; i < count - 1 ; i++ ) {
if ( strcmp( div[ i ].file , div[ i + 1 ].file ) == 0 ) {
printf( "\n部分ファイルの名前で、同じ名前<%s>があるので処理"
"できません"
"\nどれかを削除して下さい"
"\n\n\t処理を中断します\n" , div[ i ].file
);
exit( 1 );
};
};
return( count );
}
static int isOldDiv( int new )
{
int i;
char *p;
p = div_new[ new ].file;
for ( i = 0 ; i < max_old_div ; i++ ) {
if ( strcmp( p , div_old[ i ].file ) == 0 ) {
/* 一致した → 古いファイルにある */
return( i );
};
};
return( -1 ); /* 古いファイルにはない */
}
static int isEqu( int new , int old )
{
int result;
char str2[ 2048 ];
fpi = fopen( new_file , "r" ); fps = fopen( old_file , "r" );
fseek( fpi , div_new[ new ].seek , SEEK_SET );
fseek( fps , div_old[ old ].seek , SEEK_SET );
result = FALSE;
while ( fgets( str , MAX_BUFSIZE , fpi ) != NULL ) {
if ( fgets( str2 , 2048 , fps ) == NULL ) break;
if ( strcmp( str , str2 ) != 0 ) break;
if ( isDivideEnd( str ) == TRUE ) {
result = TRUE;
break;
};
};
fclose( fpi ); fclose( fps );
return( result );
}
static void prEqu()
{
int new , old , equ;
printf( "\n以下の部分ファイルが見つかりました\n" );
new = old = 0;
while ( new < max_new_div ) {
if ( old >= max_old_div ) break;
equ = strcmp( div_new[ new ].file , div_old[ old ].file );
if ( equ == 0 ) {
/* 同じ部分ファイルがある場合 */
color( WHITE );
printf( "%-13s\t" , div_new[ new ].file );
new++; old++;
} else if ( equ < 0 ) {
/* 新の方が小さい場合 */
color( GREEN );
while ( strcmp( div_new[ new ].file , div_old[ old ].file ) < 0 ) {
printf( "%-13s\t" , div_new[ new ].file );
new++;
if ( new >= max_new_div ) break;
};
} else {
/* 新の方が大きい場合 */
color( YELLOW );
while ( strcmp( div_new[ new ].file , div_old[ old ].file ) > 0 ) {
printf( "%-13s\t" , div_old[ old ].file );
old++;
if ( old >= max_old_div ) break;
};
};
};
color( GREEN );
while ( new < max_new_div ) {
printf( "%-13s\t" , div_new[ new ].file );
new++;
};
color( WHITE );
}
static void make_old_file( char *new_file , char *old_file )
{
size_t size;
printf( "\n新しいファイルのコピー作成 %s → %s " , new_file , old_file );
fpi = fopen( new_file , "rb" ); fps = fopen( old_file , "wb" );
while( ( size = fread(str,sizeof(char),MAX_BUFSIZE,fpi) ) == MAX_BUFSIZE){
fwrite( str , sizeof( char ) , size , fps );
};
fwrite( str , sizeof( char ) , size , fps );
fclose( fpi ); fclose( fps );
printf( "終了" );
}
static void main_loop( const char *file )
{
int i , old , copy_sw;
char *p1 , *p2;
if ( strlen( file ) >= MAX_FILENAME_LEN ) {
printf( "\n ただ今の仕様で、指定のファイル名の長さは %d バイトまで"
"となっています。"
"\n 申し訳ありませんがディレクトリを移動して実行して下さい。",
MAX_FILENAME_LEN
);
exit( 1 );
};
/* ファイル名を設定しておく */
strcpy( new_file , file ); strcpy( old_file , file );
p1 = last_yen( old_file ); p2 = last_comma( p1 );
if ( p1 != p2 ) *p2 = '\0'; /* 拡張子を削除する */
strcat( old_file , ".old" ); /* 拡張子を old にする */
printf( "\n<%-13s>から部分ファイルを検索 " , file );
max_new_div = set_struct_div( file , div_new );
printf( "(%d) 終了" , max_new_div );
if ( max_new_div == 0 ) {
printf( "\n<%s>が見つかりません。" , file );
return;
};
/**************************************************************/
/* 部分ファイル名に元のファイル名が入っていないかチェックする */
/**************************************************************/
for ( i=0 ; i < max_new_div ; i++ ) {
if ( strcmp( file , div_new[ i ].file ) == 0 ) {
printf( "\n 部分ファイル名の中に元のファイル名と"
"同じファイル名のものがあります。"
"\n 分割すると元のファイルが削除されてしまうおそれが"
"あります。"
"\n 処理を中断します"
);
exit( 1 );
};
};
if ( make_new_file == TRUE ) {
p1 = last_comma( old_file ); *p1 = '\0';
strcat( old_file , ".new" );
if ( ( fpo = fopen( old_file , "a" ) ) == NULL ) {
printf( "\n<%s>を書き込みの為にオープンできません" , old_file );
return;
};
fpi = fopen( new_file , "r" );
line_number = 0;
printf( "\n<%s>を作ります" , old_file );
for ( i = 0 ; i < max_new_div ; i++ ) {
fseek( fpi , div_new[ i ].seek , SEEK_SET );
while ( fgets( str , MAX_BUFSIZE , fpi ) != NULL ) {
fprintf( fpo , "%s" , str ); line_number++;
/* divide_end という行を書き出してから終了判定を行う */
if ( isDivideEnd( str ) == TRUE ) break;
};
fprintf( fpo , "\n" ); /* 1行空ける */
};
printf( " %4d 行 終了" , line_number );
fclose( fpo ); fclose( fpi );
return;
};
copy_sw = FALSE;
if ( max_out_files == 0 ) {
/* 古い方のファイルから部分ファイルを取り出す */
printf( "\n<%-13s>から部分ファイルを検索 " , old_file );
max_old_div = set_struct_div( old_file , div_old );
printf( "(%d) 終了" , max_old_div );
/* 部分ファイルの表示 */
mess_check prEqu();
for( i = 0 ; i < max_new_div ; i++ ) {
if ( access( div_new[ i ].file , 0 ) != 0 ) {
/* ディレクトリ上にファイルにはない */
main_loop_sub( i ); copy_sw = TRUE;
} else if ( ( old = isOldDiv( i ) ) < 0 ) {
/* 古いファイルにはない → 追加された */
main_loop_sub( i ); copy_sw = TRUE;
} else if ( isEqu( i , old ) != TRUE ) {
/* 古いファイルにある → 内容チェック */
/* 内容が変更された */
main_loop_sub( i ); copy_sw = TRUE;
};
};
} else {
for( i = 0 ; i < max_new_div ; i++ ) {
if ( check_file_name( div_new[ i ].file ) == TRUE ) {
main_loop_sub( i );
/* 以下の1行をコメントアウトした 1993.3.21
copy_sw = TRUE;
これによって、「-o:xxxxx」オプションを指定した場合
*.old というファイルは出力しないようになった。
*/
};
};
};
if ( copy_sw == TRUE ) {
/* 新ファイルを旧ファイルにコピーする */
make_old_file( new_file , old_file );
};
if ( list_file_sw == TRUE ) {
printf( "\n部分ファイルのリストを出力 " );
if ( ( fpi = fopen( list_file_name , "w" ) ) == NULL ) {
printf( "<%s>をオープンできません" , list_file_name );
return;
};
for ( i = 0 ; i < max_new_div ; i++ ) {
p1 = div_new[ i ].file;
while ( *p1 ) *p1++ = tolower( *p1 );
fprintf( fpi , "%s\n" , div_new[ i ].file );
};
fclose( fpi );
printf( "終了" );
};
}
/* outfile → new_file */
static void update_all_file_sub1()
{
int sw , div_c ;
FILE *fpi , *fpo;
char *ptr;
if ( ( fpi = fopen( outfile , "r" ) ) == NULL ) {
printf( "\n<%s>をオープンできません。" , outfile );
exit( 1 );
};
if ( ( fpo = fopen( new_file , "a" ) ) == NULL ) {
printf( "\n<%s>をオープンできません。" , new_file );
exit( 1 );
};
ptr = outfile;
while ( *ptr ) *ptr++ = tolower( *ptr );
printf( "\n<%-13s>を処理します " , outfile );
line_number = 0;
/* 1行目をチェックする */
fgets( str , MAX_BUFSIZE , fpi );
if ( isStartLine( str , &sw ) == TRUE ) {
/* divide_start の行がある */
div_c = *str; /* 1桁目を保存しておく */
} else {
ptr = last_comma( outfile );
if ( ptr == outfile ) { div_c = '#';
fprintf( fpo , "# DIVIDE_START=%s\n" , outfile );
} else if ( strcmp( ptr , ".c" ) == 0 ) { div_c = '/';
fprintf( fpo , "/* DIVIDE_START=%s */\n" , outfile );
} else if ( strcmp( ptr , ".plt" ) == 0 ) { div_c = '/';
fprintf( fpo , "/* DIVIDE_START=%s */\n" , outfile );
} else if ( strcmp( ptr , ".plp" ) == 0 ) { div_c = '/';
fprintf( fpo , "/* DIVIDE_START=%s */\n" , outfile );
} else if ( strcmp( ptr , ".asm" ) == 0 ) { div_c = ';';
fprintf( fpo , "; DIVIDE_START=%s\n" , outfile );
} else if ( strcmp( ptr , ".lnk" ) == 0 ) { div_c = ';';
fprintf( fpo , "; -DIVIDE_START=%s\n" , outfile );
} else if ( strcmp( ptr , ".bat" ) == 0 ) { div_c = 'R';
fprintf( fpo , "REM DIVIDE_START=%s\n" , outfile );
} else { div_c = '/';
fprintf( fpo , "/* DIVIDE_START=%s */\n" , outfile );
};
};
fprintf( fpo , "%s" , str ); /* 1行目を書き出す */
line_number++;
/* ファイルの最終行をチェックしながら書き出す */
sw = FALSE;
while ( fgets( str , MAX_BUFSIZE , fpi ) != NULL ) {
if ( isDivideEnd( str ) == TRUE ) {
sw = TRUE; break;
};
fprintf( fpo , "%s" , str );
line_number++;
};
if ( sw == TRUE ) {
fprintf( fpo , "%s" , str );
} else {
/* devide_end の行を書き出す */
if ( div_c == '/' ) {
fprintf( fpo , "/* DIVIDE_END */\n" );
} else if ( div_c == '#' ) {
fprintf( fpo , "# DIVIDE_END\n" );
} else if ( div_c == ';' ) {
fprintf( fpo , "; DIVIDE_END\n" );
} else if ( div_c == 'R' ) {
fprintf( fpo , "REM DIVIDE_END\n" );
} else {
fprintf( fpo , "/* DIVIDE_END */\n" );
};
};
fprintf( fpo, "\n" ); /* 1993.8.7 追加 */
line_number++;
printf( " %4d 行 終了" , line_number );
fclose( fpi );
fclose( fpo );
}
/* old_file → new_file */
static void update_all_file( int append_sw )
{
int done , cnt ;
struct ffblk ffblk;
char path[ MAX_FILENAME_LEN ] , *p1 , *p2 ;
/* もし new_file が存在するならば、警告を出す */
if ( access( new_file , 0 ) == 0
&& append_sw == NO
) {
/* ファイルが存在する */
printf( "\n<%-13s>というファイルがあります。削除してもよろしいですか?"
, new_file
);
if ( get_yesno_mes() == YES ) {
remove( new_file );
printf( "\n 削除しました" );
} else {
printf( "\n追加モードで書き込んでもよろしいですか?" );
if ( get_yesno_mes() == NO ) {
printf( "\n 終了します" ); exit( 1 );
};
};
};
strcpy( path , old_file );
if ( path[2] == ':' ) { p1 = path + 3;
} else { p1 = path;
};
p2 = last_yen( p1 );
if ( p2 != p1 ) { *(p2+1) = '\0';
} else { *p2 = '\0';
};
cnt = 0; done = findfirst( old_file , &ffblk , FA_DIREC );
while ( ! done ) {
if ( strcmp( ffblk.ff_name , ".." ) != 0
&& strcmp( ffblk.ff_name , "." ) != 0
) {
strcpy( outfile , path );
strcat( outfile , ffblk.ff_name );
update_all_file_sub1( );
cnt++;
};
done = findnext( &ffblk );
};
printf( "\t%d 個のファイルがありました" , cnt );
}
static void
appendFile( const char *opt, const char *outFile, int append_sw )
{
char *p;
/* -u:xxxxx オプション */
/* -a:xxxxx オプション */
/* old_file → new_file */
if ( strlen( opt ) >= MAX_FILENAME_LEN ) {
printf( "検索するファイル名の長さが長すぎます");
exit( 1 );
};
strcpy( old_file , opt );
strcpy( new_file , outFile );
update_all_file( append_sw );
/* *.old ファイルを作る */
strcpy( old_file , new_file ); p = last_yen( old_file );
if ( p != last_comma(p) ) { p = last_comma(p); *p='\0';
};
strcat( old_file , ".old" );
make_old_file( new_file , old_file );
}
void main( int argc , char **argv )
{
char *p;
strcpy( str, *argv );
if ( argc <= 1 ) {
useage();
exit( 1 );
};
while ( --argc ) {
++argv;
if ( **argv == '-' ) {
if ( strncmp( *argv , "-u:" , 3 ) == 0 ) {
if ( --argc ) {
p = *argv + 3; argv++;
appendFile( p, *argv , NO );
} else { break;
};
} else if ( strncmp( *argv , "-a:" , 3 ) == 0 ) {
if ( --argc ) {
p = *argv + 3; argv++;
appendFile( p, *argv , YES );
} else { break;
};
} else {
set_options( *argv + 1 );
};
} else { main_loop( *argv );
};
};
if ( list_file_sw != FALSE ) fclose( fpl );
printf( "\n" );
exit( 0 );
}
/* DIVIDE_END */